const dayjs = require('dayjs');
/**
 * 研发项目状态历史模型
 * 记录项目状态变更历史
 */
const { BaseModel } = require('../config/models_config');

class ResearchProjectStateHistoryModel extends BaseModel {
	constructor() {
		super();
		this.setCollection('research_project_state_history');
	}

	/**
	 * 获取状态流转类型名称
	 * @param {Number} type 状态流转类型
	 * @returns {String} 状态流转类型名称
	 */
	static getFlowTypeName(type) {
		return this.FLOW_TYPE_NAME[type] || '未知';
	}

	/**
	 * 获取状态流转类型颜色
	 * @param {Number} type 状态流转类型
	 * @returns {String} 状态流转类型颜色
	 */
	static getFlowTypeColor(type) {
		const colors = {
			[this.FLOW_TYPE.NORMAL]: '#52c41a', // 正常
			[this.FLOW_TYPE.ROLLBACK]: '#ff6600', // 回退
			[this.FLOW_TYPE.BRANCH]: '#0066cc', // 分支
			[this.FLOW_TYPE.MERGE]: '#9900cc', // 合并
			[this.FLOW_TYPE.SKIP]: '#ff9900', // 跳过
			[this.FLOW_TYPE.EXCEPTIONAL]: '#ff3366' // 异常
		};
		return colors[type] || '#999999';
	}
	
	/**
	 * 获取文档状态名称
	 * @param {Number} status 文档状态
	 * @returns {String} 文档状态名称
	 */
	static getDocStatusName(status) {
		return this.DOC_STATUS_NAME[status] || '未知';
	}
	
	/**
	 * 获取文档状态颜色
	 * @param {Number} status 文档状态
	 * @returns {String} 文档状态颜色
	 */
	static getDocStatusColor(status) {
		const colors = {
			[this.DOC_STATUS.NOT_UPLOADED]: '#ff9900', // 未上传
			[this.DOC_STATUS.UPLOADED]: '#52c41a', // 已上传
			[this.DOC_STATUS.NOT_REQUIRED]: '#999999', // 不需要
			[this.DOC_STATUS.WAITING_APPROVAL]: '#0066cc', // 待审批
			[this.DOC_STATUS.REJECTED]: '#ff6600' // 已驳回
		};
		return colors[status] || '#999999';
	}
	
	/**
	 * 格式化状态历史记录
	 * @param {Object} data 历史记录数据
	 * @returns {Object} 格式化后的历史记录
	 */
	static formatStateHistory(data) {
		if (!data) return null;
		
		// 添加格式化的时间字段
		const formatTime = data.OPERATE_TIME ? dayjs(data.OPERATE_TIME * 1000).format("YYYY-MM-DD HH:mm:ss") : '';
		
		return {
			...data,
			formatTime,
			flowTypeName: this.getFlowTypeName(data.FLOW_TYPE),
			flowTypeColor: this.getFlowTypeColor(data.FLOW_TYPE)
		};
	}
	
	/**
	 * 获取状态节点层级
	 * @param {Object} node 状态节点数据
	 * @returns {Number} 节点层级
	 */
	static getNodeLevel(node) {
		if (!node) return 0;
		
		// 计算节点层级，主要基于分支和合并信息
		let level = 0;
		
		if (node.FLOW_TYPE === this.FLOW_TYPE.BRANCH) {
			level = 1; // 分支节点增加层级
		} else if (node.FLOW_TYPE === this.FLOW_TYPE.MERGE) {
			level = -1; // 合并节点减少层级
		}
		
		return level;
	}
}

// 状态流转类型枚举
ResearchProjectStateHistoryModel.FLOW_TYPE = {
	NORMAL: 1, // 正常
	ROLLBACK: 2, // 回退
	BRANCH: 3, // 分支
	MERGE: 4, // 合并
	SKIP: 5, // 跳过
	EXCEPTIONAL: 6 // 异常
};

// 状态流转类型名称
ResearchProjectStateHistoryModel.FLOW_TYPE_NAME = {
	[ResearchProjectStateHistoryModel.FLOW_TYPE.NORMAL]: '正常',
	[ResearchProjectStateHistoryModel.FLOW_TYPE.ROLLBACK]: '回退',
	[ResearchProjectStateHistoryModel.FLOW_TYPE.BRANCH]: '分支',
	[ResearchProjectStateHistoryModel.FLOW_TYPE.MERGE]: '合并',
	[ResearchProjectStateHistoryModel.FLOW_TYPE.SKIP]: '跳过',
	[ResearchProjectStateHistoryModel.FLOW_TYPE.EXCEPTIONAL]: '异常'
};

// 文档状态枚举
ResearchProjectStateHistoryModel.DOC_STATUS = {
	NOT_UPLOADED: 1, // 未上传
	UPLOADED: 2, // 已上传
	NOT_REQUIRED: 3, // 不需要
	WAITING_APPROVAL: 4, // 待审批
	REJECTED: 5 // 已驳回
};

// 文档状态名称
ResearchProjectStateHistoryModel.DOC_STATUS_NAME = {
	[ResearchProjectStateHistoryModel.DOC_STATUS.NOT_UPLOADED]: '未上传',
	[ResearchProjectStateHistoryModel.DOC_STATUS.UPLOADED]: '已上传',
	[ResearchProjectStateHistoryModel.DOC_STATUS.NOT_REQUIRED]: '不需要',
	[ResearchProjectStateHistoryModel.DOC_STATUS.WAITING_APPROVAL]: '待审批',
	[ResearchProjectStateHistoryModel.DOC_STATUS.REJECTED]: '已驳回'
};

// 数据结构定义
ResearchProjectStateHistoryModel.DB_STRUCTURE = {
	_id: 'string|true',
	PROJECT_ID: 'string|true|comment=项目ID',
	PROJECT_CODE: 'string|true|comment=项目编码',
	PROJECT_NAME: 'string|true|comment=项目名称',
	
	FROM_STATUS: 'int|true|comment=起始状态',
	FROM_SUB_STATUS: 'int|false|comment=起始子状态',
	FROM_ACTIVE_STATUS: 'int|false|comment=起始活动状态',
	FROM_STATUS_DESC: 'string|false|comment=起始状态描述',
	
	TO_STATUS: 'int|true|comment=目标状态',
	TO_SUB_STATUS: 'int|false|comment=目标子状态',
	TO_ACTIVE_STATUS: 'int|false|comment=目标活动状态',
	TO_STATUS_DESC: 'string|false|comment=目标状态描述',
	
	FLOW_TYPE: 'int|true|default=1|comment=流转类型：1=正常,2=回退,3=分支,4=合并,5=跳过,6=异常',
	FLOW_REASON: 'string|false|comment=流转原因',
	
	OPERATE_USER_ID: 'string|true|comment=操作用户ID',
	OPERATE_USER_NAME: 'string|true|comment=操作用户名称',
	OPERATE_USER_AVATAR: 'string|false|comment=操作用户头像',
	OPERATE_USER_DEPT: 'string|false|comment=操作用户部门',
	OPERATE_TIME: 'int|true|comment=操作时间',
	OPERATE_IP: 'string|false|comment=操作IP',
	
	PARENT_NODE_ID: 'string|false|comment=父节点ID（用于分支节点）',
	MERGE_TARGET_NODE_ID: 'string|false|comment=合并目标节点ID（用于合并节点）',
	
	NOTES: 'string|false|comment=备注',
	
	REQUIRED_DOCS: 'array|true|default=[]|comment=关联的必要文档',
	/*
	[
		{
			DOC_ID: 'string', // 文档ID
			DOC_NAME: 'string', // 文档名称
			DOC_TYPE: 'number', // 文档类型：0=包装指引,1=加工指引,2=物料变更通知,3=认证报告,等
			DOC_URL: 'string', // 文档链接
			DOC_STATUS: 'number', // 文档状态：1=未上传,2=已上传,3=不需要,4=待审批,5=已驳回
		}
	]
	*/
	
	RESOURCE_VERSIONS: 'array|true|default=[]|comment=关联的资源版本',
	/*
	[
		{
			RESOURCE_ID: 'string', // 资源ID
			RESOURCE_NAME: 'string', // 资源名称
			RESOURCE_TYPE: 'number', // 资源类型：0=PCB,1=BOM,2=包装指引,3=加工指引,等
			VERSION: 'string', // 版本号
			VERSION_DESC: 'string', // 版本描述
			IS_CURRENT: 'number', // 是否为当前版本：0=否,1=是
		}
	]
	*/
	
	APPROVAL_ID: 'string|false|comment=关联的审批ID',
	APPROVAL_STATUS: 'int|false|comment=审批状态',
	
	RELATED_ISSUES: 'array|true|default=[]|comment=关联的问题',
	/*
	[
		{
			ISSUE_ID: 'string', // 问题ID
			ISSUE_TITLE: 'string', // 问题标题
			ISSUE_STATUS: 'number', // 问题状态
		}
	]
	*/
	
	TAGS: 'array|true|default=[]|comment=标签',
	/*
	[
		{
			TAG_ID: 'string', // 标签ID
			TAG_NAME: 'string', // 标签名称
		}
	]
	*/
	
	GITEA_TAG: 'string|false|comment=Gitea标签',
	BRANCH_ID: 'string|false|comment=分支ID',
	BRANCH_NAME: 'string|false|comment=分支名称',
	
	DISPLAY_POSITION: 'object|false|comment=显示位置',
	/*
	{
		x: 'number', // X坐标
		y: 'number', // Y坐标
		level: 'number', // 层级
	}
	*/
	
	GRAPH_METADATA: 'object|false|comment=图谱元数据',
	/*
	{
		color: 'string', // 节点颜色
		shape: 'string', // 节点形状
		size: 'number', // 节点大小
		highlighted: 'boolean', // 是否高亮
	}
	*/
	
	NEXT_NODES: 'array|true|default=[]|comment=下一节点ID',
	PREV_NODES: 'array|true|default=[]|comment=上一节点ID',
	
	IS_MILESTONE: 'int|true|default=0|comment=是否为里程碑节点：0=否,1=是',
	MILESTONE_DESC: 'string|false|comment=里程碑描述',
	
	HAS_SNAPSHOT: 'int|true|default=0|comment=是否有快照：0=否,1=是',
	SNAPSHOT_ID: 'string|false|comment=快照ID',
	
	CREATE_TIME: 'int|true',
	UPDATE_TIME: 'int|true'
};

module.exports = ResearchProjectStateHistoryModel; 